#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>



//提供各种功能的接口类
//字符串转换、提取行...
class Util
{
public:
    //从sock中读取一行到outbuf里 返回读取到的字符个数
    static int ReadLine(int sock, std::string &outbuf)
    {
        char ch = '1';
        while(ch != '\n')
        {
            ssize_t s = recv(sock, &ch, 1, 0);
            if(s > 0)       //读取成功
            {
                if(ch == '\r')
                {
                    // 将\r ?   \r\n?  都转化-->\n 

                    //MSG_PEEK  数据窥探 查看下一个字符是否是\n ，并不从sock中取走
                    recv(sock, &ch, 1, MSG_PEEK);
                    if(ch == '\n')  //\n才结束一行
                    {
                        recv(sock, &ch, 1, 0);
                    }
                    else           //\r已经结束这一行
                    {
                        ch == '\n';
                    }
                }
 
                //1、不是\r  普通字符
                //2、是\r 或者 \r\n 但是都已经被转换成了我们的行分隔符\n
                outbuf += ch;
            }
            else if(s == 0) //对端关闭
            {
                //..
                return 0;
            }
            else            //s<0 读取失败
            {
                //..
                return -1;
            }
        }
        return outbuf.size();
    }

    //以sep为分隔符将字符串src 切分成sub1与sub2两部分
    static bool CutString(const std::string &src,const std::string& sep, std::string& sub1, std::string& sub2)
    {
        size_t pos = src.find(sep);          //寻找分隔符
        if(pos != std::string::npos)         //找不到返回npos
        {                                    //找到sep,返回sep的起始位置(字节数)
            sub1 = src.substr(0, pos);   
            sub2 = src.substr(pos + sep.size());
            
            return true;
        }
        return false;
    }
};
